/**
 * 继承对象的属性（我觉得是伪继承，其实就是重命名 Object assign 方法） 
 */
export const extend = Object.assign;


/**
 * 判断一个对象是否为 object 引用类型，包括数组[]
 * @param raw 传入的对象
 * @returns 是否为 object 引用类型,true 是，false 否
 */
export function isObject(raw) {
    if (raw != null && typeof raw === 'object')
        return true;
    return false
}


/**
 * 比较两个对象是否改变
 * @param nowValue 当前值
 * @param newValue 新值
 * @returns 是否改变，true 改变，false 未改变
 */
export function isChanged(nowValue, newValue) {
    return !Object.is(nowValue, newValue);
}



export const EMPTY_OBJECT = {};

/**
 * 判断 key 是否为 on[A-Z]开头
 * @param key string key 值
 * @returns true 是，false 否
 */
export function isOn(key: string) {
    return /^on[A-Z]/.test(key);
}


/**
 * 判断对象中是否存在 key
 * @param val 检查对象
 * @param key key
 * @returns  返回是否存在，true 是，false 否
 */
export const hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key);


/**
 * 首字母转大写
 * @param str 传入字符串
 * @returns 返回字符串
 */
export const capitalize = (str: string) => {
    return str.charAt(0).toUpperCase() + str.slice(1);
}


/**
 * 转为驼峰命名法('-'分割的转为大写开头，如 aa-bb-cc 转换为 aaBbCc)
 * @param str 传入字符串
 * @returns 返回字符串
 */
export const camelize = (str: string) => {
    return str.replace(/-(\w)/g, (_, c: string) => {
        return c ? c.toUpperCase() : "";
    })
}


/**
 * 传入一个字符串，转换为 on[A-Z] 开头
 * @param str 传入字符串
 * @returns 返回字符串
 */
export const toHandlerKey = (event: string) => {
    return event ? "on" + capitalize(event) : "";
}